{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Time Series\n",
    "\n",
    "## About the Data\n",
    "In this notebook, we will be working with 5 data sets:\n",
    "- (CSV) Facebook's stock price daily throughout 2018 (obtained using the [`stock_analysis` package](https://github.com/stefmolin/stock-analysis)).\n",
    "- (CSV) Facebook's OHLC stock data from May 20, 2019 - May 24, 2019 per minute from [Nasdaq.com](https://www.nasdaq.com/symbol/fb/interactive-chart).\n",
    "- (CSV) melted stock data for Facebook from May 20, 2019 - May 24, 2019 per minute from [Nasdaq.com](https://www.nasdaq.com/symbol/fb/interactive-chart).\n",
    "- (DB) stock opening prices by the minute for Apple from May 20, 2019 - May 24, 2019 altered to have seconds in the time from [Nasdaq.com](https://www.nasdaq.com/symbol/aapl/interactive-chart).\n",
    "- (DB) stock opening prices by the minute for Facebook from May 20, 2019 - May 24, 2019 from [Nasdaq.com](https://www.nasdaq.com/symbol/fb/interactive-chart).\n",
    "\n",
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.5500</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.3300</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>184.90</td>\n",
       "      <td>186.21</td>\n",
       "      <td>184.0996</td>\n",
       "      <td>184.33</td>\n",
       "      <td>13880896</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>185.59</td>\n",
       "      <td>186.90</td>\n",
       "      <td>184.9300</td>\n",
       "      <td>186.85</td>\n",
       "      <td>13574535</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>187.20</td>\n",
       "      <td>188.90</td>\n",
       "      <td>186.3300</td>\n",
       "      <td>188.28</td>\n",
       "      <td>17994726</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high       low   close    volume trading_volume\n",
       "date                                                                 \n",
       "2018-01-02  177.68  181.58  177.5500  181.42  18151903            low\n",
       "2018-01-03  181.88  184.78  181.3300  184.67  16886563            low\n",
       "2018-01-04  184.90  186.21  184.0996  184.33  13880896            low\n",
       "2018-01-05  185.59  186.90  184.9300  186.85  13574535            low\n",
       "2018-01-08  187.20  188.90  186.3300  188.28  17994726            low"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "fb = pd.read_csv('data/fb_2018.csv', index_col='date', parse_dates=True).assign(\n",
    "    trading_volume=lambda x: pd.cut(x.volume, bins=3, labels=['low', 'med', 'high'])\n",
    ")\n",
    "fb.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Time-based selection and filtering\n",
    "Remember, when we have a `DatetimeIndex`, we can use datetime slicing. We can provide a range of dates. We only get three days back because the stock market is closed on the weekends:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-10-11</th>\n",
       "      <td>150.13</td>\n",
       "      <td>154.81</td>\n",
       "      <td>149.1600</td>\n",
       "      <td>153.35</td>\n",
       "      <td>35338901</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-12</th>\n",
       "      <td>156.73</td>\n",
       "      <td>156.89</td>\n",
       "      <td>151.2998</td>\n",
       "      <td>153.74</td>\n",
       "      <td>25293492</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-15</th>\n",
       "      <td>153.32</td>\n",
       "      <td>155.57</td>\n",
       "      <td>152.5500</td>\n",
       "      <td>153.52</td>\n",
       "      <td>15433521</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high       low   close    volume trading_volume\n",
       "date                                                                 \n",
       "2018-10-11  150.13  154.81  149.1600  153.35  35338901            low\n",
       "2018-10-12  156.73  156.89  151.2998  153.74  25293492            low\n",
       "2018-10-15  153.32  155.57  152.5500  153.52  15433521            low"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-10-11':'2018-10-15']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can select ranges of months and quarters:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-q1'].equals(fb['2018-01':'2018-03'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `first()` method will give us a specified length of time from the beginning of the time series. Here, we ask for a week. January 1, 2018 was a holiday—meaning the market was closed. It was also a Monday, so the week here is only four days:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.5500</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.3300</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>184.90</td>\n",
       "      <td>186.21</td>\n",
       "      <td>184.0996</td>\n",
       "      <td>184.33</td>\n",
       "      <td>13880896</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>185.59</td>\n",
       "      <td>186.90</td>\n",
       "      <td>184.9300</td>\n",
       "      <td>186.85</td>\n",
       "      <td>13574535</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high       low   close    volume trading_volume\n",
       "date                                                                 \n",
       "2018-01-02  177.68  181.58  177.5500  181.42  18151903            low\n",
       "2018-01-03  181.88  184.78  181.3300  184.67  16886563            low\n",
       "2018-01-04  184.90  186.21  184.0996  184.33  13880896            low\n",
       "2018-01-05  185.59  186.90  184.9300  186.85  13574535            low"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.first('1W')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `last()` method will take from the end:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-12-31</th>\n",
       "      <td>134.45</td>\n",
       "      <td>134.64</td>\n",
       "      <td>129.95</td>\n",
       "      <td>131.09</td>\n",
       "      <td>24625308</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close    volume trading_volume\n",
       "date                                                               \n",
       "2018-12-31  134.45  134.64  129.95  131.09  24625308            low"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.last('1W')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the next few examples, we need datetimes, so we will read in the stock data per minute file:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>159049.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>468017.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>97258.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:33:00</th>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>43961.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:34:00</th>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>79562.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                         open      high       low     close    volume\n",
       "date                                                                 \n",
       "2019-05-20 09:30:00  181.6200  181.6200  181.6200  181.6200  159049.0\n",
       "2019-05-20 09:31:00  182.6100  182.6100  182.6100  182.6100  468017.0\n",
       "2019-05-20 09:32:00  182.7458  182.7458  182.7458  182.7458   97258.0\n",
       "2019-05-20 09:33:00  182.9500  182.9500  182.9500  182.9500   43961.0\n",
       "2019-05-20 09:34:00  183.0600  183.0600  183.0600  183.0600   79562.0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute = pd.read_csv(\n",
    "    'data/fb_week_of_may_20_per_minute.csv', index_col='date', parse_dates=True, \n",
    "    date_parser=lambda x: pd.to_datetime(x, format='%Y-%m-%d %H-%M')\n",
    ")\n",
    "\n",
    "stock_data_per_minute.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the `Grouper` to roll up our data to the daily level along with `first` and `last`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20</th>\n",
       "      <td>181.62</td>\n",
       "      <td>184.1800</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>182.72</td>\n",
       "      <td>10044838.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21</th>\n",
       "      <td>184.53</td>\n",
       "      <td>185.5800</td>\n",
       "      <td>183.9700</td>\n",
       "      <td>184.82</td>\n",
       "      <td>7198405.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22</th>\n",
       "      <td>184.81</td>\n",
       "      <td>186.5603</td>\n",
       "      <td>184.0120</td>\n",
       "      <td>185.32</td>\n",
       "      <td>8412433.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23</th>\n",
       "      <td>182.50</td>\n",
       "      <td>183.7300</td>\n",
       "      <td>179.7559</td>\n",
       "      <td>180.87</td>\n",
       "      <td>12479171.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24</th>\n",
       "      <td>182.33</td>\n",
       "      <td>183.5227</td>\n",
       "      <td>181.0400</td>\n",
       "      <td>181.06</td>\n",
       "      <td>7686030.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open      high       low   close      volume\n",
       "date                                                      \n",
       "2019-05-20  181.62  184.1800  181.6200  182.72  10044838.0\n",
       "2019-05-21  184.53  185.5800  183.9700  184.82   7198405.0\n",
       "2019-05-22  184.81  186.5603  184.0120  185.32   8412433.0\n",
       "2019-05-23  182.50  183.7300  179.7559  180.87  12479171.0\n",
       "2019-05-24  182.33  183.5227  181.0400  181.06   7686030.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.groupby(pd.Grouper(freq='1D')).agg({\n",
    "    'open': 'first',\n",
    "    'high': 'max', \n",
    "    'low': 'min', \n",
    "    'close': 'last', \n",
    "    'volume': 'sum'\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `at_time()` method allows us to pull out all datetimes that match a certain time. Here, we can grab all the rows from the time the stock market opens (9:30 AM):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.62</td>\n",
       "      <td>181.62</td>\n",
       "      <td>181.62</td>\n",
       "      <td>181.62</td>\n",
       "      <td>159049.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21 09:30:00</th>\n",
       "      <td>184.53</td>\n",
       "      <td>184.53</td>\n",
       "      <td>184.53</td>\n",
       "      <td>184.53</td>\n",
       "      <td>58171.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22 09:30:00</th>\n",
       "      <td>184.81</td>\n",
       "      <td>184.81</td>\n",
       "      <td>184.81</td>\n",
       "      <td>184.81</td>\n",
       "      <td>41585.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23 09:30:00</th>\n",
       "      <td>182.50</td>\n",
       "      <td>182.50</td>\n",
       "      <td>182.50</td>\n",
       "      <td>182.50</td>\n",
       "      <td>121930.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24 09:30:00</th>\n",
       "      <td>182.33</td>\n",
       "      <td>182.33</td>\n",
       "      <td>182.33</td>\n",
       "      <td>182.33</td>\n",
       "      <td>52681.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       open    high     low   close    volume\n",
       "date                                                         \n",
       "2019-05-20 09:30:00  181.62  181.62  181.62  181.62  159049.0\n",
       "2019-05-21 09:30:00  184.53  184.53  184.53  184.53   58171.0\n",
       "2019-05-22 09:30:00  184.81  184.81  184.81  184.81   41585.0\n",
       "2019-05-23 09:30:00  182.50  182.50  182.50  182.50  121930.0\n",
       "2019-05-24 09:30:00  182.33  182.33  182.33  182.33   52681.0"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.at_time('9:30')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `between_time()` to grab data for the last two minutes of trading daily:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 15:59:00</th>\n",
       "      <td>182.915</td>\n",
       "      <td>182.915</td>\n",
       "      <td>182.915</td>\n",
       "      <td>182.915</td>\n",
       "      <td>134569.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 16:00:00</th>\n",
       "      <td>182.720</td>\n",
       "      <td>182.720</td>\n",
       "      <td>182.720</td>\n",
       "      <td>182.720</td>\n",
       "      <td>1113672.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21 15:59:00</th>\n",
       "      <td>184.840</td>\n",
       "      <td>184.840</td>\n",
       "      <td>184.840</td>\n",
       "      <td>184.840</td>\n",
       "      <td>61606.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21 16:00:00</th>\n",
       "      <td>184.820</td>\n",
       "      <td>184.820</td>\n",
       "      <td>184.820</td>\n",
       "      <td>184.820</td>\n",
       "      <td>801080.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22 15:59:00</th>\n",
       "      <td>185.290</td>\n",
       "      <td>185.290</td>\n",
       "      <td>185.290</td>\n",
       "      <td>185.290</td>\n",
       "      <td>96099.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22 16:00:00</th>\n",
       "      <td>185.320</td>\n",
       "      <td>185.320</td>\n",
       "      <td>185.320</td>\n",
       "      <td>185.320</td>\n",
       "      <td>1220993.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23 15:59:00</th>\n",
       "      <td>180.720</td>\n",
       "      <td>180.720</td>\n",
       "      <td>180.720</td>\n",
       "      <td>180.720</td>\n",
       "      <td>109648.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23 16:00:00</th>\n",
       "      <td>180.870</td>\n",
       "      <td>180.870</td>\n",
       "      <td>180.870</td>\n",
       "      <td>180.870</td>\n",
       "      <td>1329217.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24 15:59:00</th>\n",
       "      <td>181.070</td>\n",
       "      <td>181.070</td>\n",
       "      <td>181.070</td>\n",
       "      <td>181.070</td>\n",
       "      <td>52994.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24 16:00:00</th>\n",
       "      <td>181.060</td>\n",
       "      <td>181.060</td>\n",
       "      <td>181.060</td>\n",
       "      <td>181.060</td>\n",
       "      <td>764906.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        open     high      low    close     volume\n",
       "date                                                              \n",
       "2019-05-20 15:59:00  182.915  182.915  182.915  182.915   134569.0\n",
       "2019-05-20 16:00:00  182.720  182.720  182.720  182.720  1113672.0\n",
       "2019-05-21 15:59:00  184.840  184.840  184.840  184.840    61606.0\n",
       "2019-05-21 16:00:00  184.820  184.820  184.820  184.820   801080.0\n",
       "2019-05-22 15:59:00  185.290  185.290  185.290  185.290    96099.0\n",
       "2019-05-22 16:00:00  185.320  185.320  185.320  185.320  1220993.0\n",
       "2019-05-23 15:59:00  180.720  180.720  180.720  180.720   109648.0\n",
       "2019-05-23 16:00:00  180.870  180.870  180.870  180.870  1329217.0\n",
       "2019-05-24 15:59:00  181.070  181.070  181.070  181.070    52994.0\n",
       "2019-05-24 16:00:00  181.060  181.060  181.060  181.060   764906.0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.between_time('15:59', '16:00')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "On average, are more shares traded within the first 30 minutes of trading or in the last 30 minutes? We can combine `between_time()` with `Groupers` and `filter()` from the [3-aggregation.ipynb notebook](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/blob/master/ch_04/3-aggregations.ipynb) to answer this question. For the week in question, more are traded on average around opening time than closing time:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18592.967741935485"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shares_traded_in_first_30_min = stock_data_per_minute\\\n",
    "    .between_time('9:30', '10:00')\\\n",
    "    .groupby(pd.Grouper(freq='1D'))\\\n",
    "    .filter(lambda x: (x.volume > 0).all())\\\n",
    "    .volume.mean()\n",
    "\n",
    "shares_traded_in_last_30_min = stock_data_per_minute\\\n",
    "    .between_time('15:30', '16:00')\\\n",
    "    .groupby(pd.Grouper(freq='1D'))\\\n",
    "    .filter(lambda x: (x.volume > 0).all())\\\n",
    "    .volume.mean()\n",
    "\n",
    "shares_traded_in_first_30_min - shares_traded_in_last_30_min"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In cases where time doesn't matter, we can normalize the times to midnight:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>before</th>\n",
       "      <th>after</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2019-05-20 09:30:00</td>\n",
       "      <td>2019-05-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2019-05-20 09:31:00</td>\n",
       "      <td>2019-05-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2019-05-20 09:32:00</td>\n",
       "      <td>2019-05-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2019-05-20 09:33:00</td>\n",
       "      <td>2019-05-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2019-05-20 09:34:00</td>\n",
       "      <td>2019-05-20</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               before      after\n",
       "0 2019-05-20 09:30:00 2019-05-20\n",
       "1 2019-05-20 09:31:00 2019-05-20\n",
       "2 2019-05-20 09:32:00 2019-05-20\n",
       "3 2019-05-20 09:33:00 2019-05-20\n",
       "4 2019-05-20 09:34:00 2019-05-20"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    dict(before=stock_data_per_minute.index, after=stock_data_per_minute.index.normalize())\n",
    ").head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that we can also use `normalize()` on a `Series` object after accessing the `dt` attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "date\n",
       "2019-05-20 09:30:00   2019-05-20\n",
       "2019-05-20 09:31:00   2019-05-20\n",
       "2019-05-20 09:32:00   2019-05-20\n",
       "2019-05-20 09:33:00   2019-05-20\n",
       "2019-05-20 09:34:00   2019-05-20\n",
       "Name: date, dtype: datetime64[ns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.index.to_series().dt.normalize().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Shifting for lagged data\n",
    "We can use `shift()` to create some lagged data. By default, the shift will be one period. For example, we can use `shift()` to create a new column that indicates the previous day's closing price. From this new column, we can calculate the price change due to after hours trading (after the close one day right up to the open the following day):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "      <th>prior_close</th>\n",
       "      <th>after_hours_change_in_price</th>\n",
       "      <th>abs_change</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-07-26</th>\n",
       "      <td>174.89</td>\n",
       "      <td>180.13</td>\n",
       "      <td>173.75</td>\n",
       "      <td>176.26</td>\n",
       "      <td>169803668</td>\n",
       "      <td>high</td>\n",
       "      <td>217.50</td>\n",
       "      <td>-42.61</td>\n",
       "      <td>42.61</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-04-26</th>\n",
       "      <td>173.22</td>\n",
       "      <td>176.27</td>\n",
       "      <td>170.80</td>\n",
       "      <td>174.16</td>\n",
       "      <td>77556934</td>\n",
       "      <td>med</td>\n",
       "      <td>159.69</td>\n",
       "      <td>13.53</td>\n",
       "      <td>13.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-12</th>\n",
       "      <td>178.06</td>\n",
       "      <td>181.48</td>\n",
       "      <td>177.40</td>\n",
       "      <td>179.37</td>\n",
       "      <td>77551299</td>\n",
       "      <td>med</td>\n",
       "      <td>187.77</td>\n",
       "      <td>-9.71</td>\n",
       "      <td>9.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-10-31</th>\n",
       "      <td>155.00</td>\n",
       "      <td>156.40</td>\n",
       "      <td>148.96</td>\n",
       "      <td>151.79</td>\n",
       "      <td>60101251</td>\n",
       "      <td>low</td>\n",
       "      <td>146.22</td>\n",
       "      <td>8.78</td>\n",
       "      <td>8.78</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-03-19</th>\n",
       "      <td>177.01</td>\n",
       "      <td>177.17</td>\n",
       "      <td>170.06</td>\n",
       "      <td>172.56</td>\n",
       "      <td>88140060</td>\n",
       "      <td>med</td>\n",
       "      <td>185.09</td>\n",
       "      <td>-8.08</td>\n",
       "      <td>8.08</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open    high     low   close     volume trading_volume  \\\n",
       "date                                                                   \n",
       "2018-07-26  174.89  180.13  173.75  176.26  169803668           high   \n",
       "2018-04-26  173.22  176.27  170.80  174.16   77556934            med   \n",
       "2018-01-12  178.06  181.48  177.40  179.37   77551299            med   \n",
       "2018-10-31  155.00  156.40  148.96  151.79   60101251            low   \n",
       "2018-03-19  177.01  177.17  170.06  172.56   88140060            med   \n",
       "\n",
       "            prior_close  after_hours_change_in_price  abs_change  \n",
       "date                                                              \n",
       "2018-07-26       217.50                       -42.61       42.61  \n",
       "2018-04-26       159.69                        13.53       13.53  \n",
       "2018-01-12       187.77                        -9.71        9.71  \n",
       "2018-10-31       146.22                         8.78        8.78  \n",
       "2018-03-19       185.09                        -8.08        8.08  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.assign(\n",
    "    prior_close=lambda x: x.close.shift(),\n",
    "    after_hours_change_in_price=lambda x: x.open - x.prior_close,\n",
    "    abs_change=lambda x: x.after_hours_change_in_price.abs()\n",
    ").nlargest(5, 'abs_change')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `tshift()` method will shift the `DatetimeIndex` rather than the data. However, if the goal is to to add/subtract time we can use `pd.Timedelta`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2018-01-01 09:30:00', '2018-01-02 09:30:00',\n",
       "               '2018-01-03 09:30:00', '2018-01-04 09:30:00',\n",
       "               '2018-01-05 09:30:00'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.date_range('2018-01-01', freq='D', periods=5) + pd.Timedelta('9 hours 30 minutes')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When working with stock data, we only have data for the dates the market was open. We can use `first_valid_index()` to give us the index of the first non-null entry in our data. For September 2018, this is September 4th:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2018-09-04 00:00:00')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-09'].first_valid_index()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Conversely, we can use `last_valid_index()` to get the last entry of non-null data. For September 2018, this is September 28th:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Timestamp('2018-09-28 00:00:00')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb['2018-09'].last_valid_index()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `asof()` to find the last non-null data before the point we are looking for, if it isn't in the index. From the previous result, we know that the market was not open on September 30th. It also isn't in the index:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.index.contains('2018-09-30')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we ask for it, we will get the data from the index we got from `fb['2018-09'].last_valid_index()`, which was September 28th:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "open                   168.33\n",
       "high                   168.79\n",
       "low                    162.56\n",
       "close                  164.46\n",
       "volume            3.42656e+07\n",
       "trading_volume            low\n",
       "Name: 2018-09-30 00:00:00, dtype: object"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.asof('2018-09-30')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Differenced data\n",
    "Using the `diff()` method is a quick way to calculate the difference between the data and a lagged version of it. By default, it will yield the result of `data - data.shift()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(\n",
    "    fb.drop(columns='trading_volume') \n",
    "    - fb.drop(columns='trading_volume').shift()\n",
    ").equals(\n",
    "    fb.drop(columns='trading_volume').diff()\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use this to see how Facebook stock changed day-over-day:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>4.20</td>\n",
       "      <td>3.20</td>\n",
       "      <td>3.7800</td>\n",
       "      <td>3.25</td>\n",
       "      <td>-1265340.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>3.02</td>\n",
       "      <td>1.43</td>\n",
       "      <td>2.7696</td>\n",
       "      <td>-0.34</td>\n",
       "      <td>-3005667.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>0.69</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0.8304</td>\n",
       "      <td>2.52</td>\n",
       "      <td>-306361.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>1.61</td>\n",
       "      <td>2.00</td>\n",
       "      <td>1.4000</td>\n",
       "      <td>1.43</td>\n",
       "      <td>4420191.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            open  high     low  close     volume\n",
       "date                                            \n",
       "2018-01-02   NaN   NaN     NaN    NaN        NaN\n",
       "2018-01-03  4.20  3.20  3.7800   3.25 -1265340.0\n",
       "2018-01-04  3.02  1.43  2.7696  -0.34 -3005667.0\n",
       "2018-01-05  0.69  0.69  0.8304   2.52  -306361.0\n",
       "2018-01-08  1.61  2.00  1.4000   1.43  4420191.0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.drop(columns='trading_volume').diff().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can specify the number of periods, can be any positive or negative integer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>-7.91</td>\n",
       "      <td>-5.32</td>\n",
       "      <td>-7.3800</td>\n",
       "      <td>-5.43</td>\n",
       "      <td>4577368.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>-5.32</td>\n",
       "      <td>-4.12</td>\n",
       "      <td>-5.0000</td>\n",
       "      <td>-3.61</td>\n",
       "      <td>-1108163.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>-3.80</td>\n",
       "      <td>-2.59</td>\n",
       "      <td>-3.0004</td>\n",
       "      <td>-3.54</td>\n",
       "      <td>1487839.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>-1.35</td>\n",
       "      <td>-0.99</td>\n",
       "      <td>-0.7000</td>\n",
       "      <td>-0.99</td>\n",
       "      <td>3044641.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>-1.20</td>\n",
       "      <td>0.50</td>\n",
       "      <td>-1.0500</td>\n",
       "      <td>0.51</td>\n",
       "      <td>8406139.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            open  high     low  close     volume\n",
       "date                                            \n",
       "2018-01-02 -7.91 -5.32 -7.3800  -5.43  4577368.0\n",
       "2018-01-03 -5.32 -4.12 -5.0000  -3.61 -1108163.0\n",
       "2018-01-04 -3.80 -2.59 -3.0004  -3.54  1487839.0\n",
       "2018-01-05 -1.35 -0.99 -0.7000  -0.99  3044641.0\n",
       "2018-01-08 -1.20  0.50 -1.0500   0.51  8406139.0"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.drop(columns='trading_volume').diff(-3).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Resampling\n",
    "Sometimes the data is at a granularity that isn't conducive to our analysis. Consider the case where we have data per minute for the full year of 2018. Let's see what happens if we try to plot this.\n",
    "\n",
    "*Plotting will be covered [next chapter](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/tree/master/ch_05), so don't worry too much about the code.*\n",
    "\n",
    "First, we import `matplotlib` for plotting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then we will look at the plot at the minute level and at the daily aggregated level (summed):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "index = pd.date_range('2018-01-01', freq='T', periods=365*24*60)\n",
    "raw = pd.DataFrame(\n",
    "    np.random.uniform(0, 10, size=index.shape[0]), index=index\n",
    ")\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(15, 5))\n",
    "raw.plot(legend=False, ax=axes[0], title='raw data')\n",
    "raw.resample('1D').sum().plot(legend=False, ax=axes[1], title='daily totals')\n",
    "for ax in axes:\n",
    "    ax.set_xlabel('date')\n",
    "    ax.set_ylabel('events')\n",
    "    \n",
    "plt.suptitle('Raw versus Resampled Data')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The plot on the left has so much data we can't see anything. However, when we aggregate to the daily totals, we see the data. We can alter the granularity of the data we are working with using resampling. Recall our minute-by-minute stock data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>159049.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.6100</td>\n",
       "      <td>468017.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.7458</td>\n",
       "      <td>97258.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:33:00</th>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.9500</td>\n",
       "      <td>43961.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:34:00</th>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>183.0600</td>\n",
       "      <td>79562.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                         open      high       low     close    volume\n",
       "date                                                                 \n",
       "2019-05-20 09:30:00  181.6200  181.6200  181.6200  181.6200  159049.0\n",
       "2019-05-20 09:31:00  182.6100  182.6100  182.6100  182.6100  468017.0\n",
       "2019-05-20 09:32:00  182.7458  182.7458  182.7458  182.7458   97258.0\n",
       "2019-05-20 09:33:00  182.9500  182.9500  182.9500  182.9500   43961.0\n",
       "2019-05-20 09:34:00  183.0600  183.0600  183.0600  183.0600   79562.0"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can resample this to get to a daily frequency:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20</th>\n",
       "      <td>181.62</td>\n",
       "      <td>184.1800</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>182.72</td>\n",
       "      <td>10044838.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21</th>\n",
       "      <td>184.53</td>\n",
       "      <td>185.5800</td>\n",
       "      <td>183.9700</td>\n",
       "      <td>184.82</td>\n",
       "      <td>7198405.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22</th>\n",
       "      <td>184.81</td>\n",
       "      <td>186.5603</td>\n",
       "      <td>184.0120</td>\n",
       "      <td>185.32</td>\n",
       "      <td>8412433.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23</th>\n",
       "      <td>182.50</td>\n",
       "      <td>183.7300</td>\n",
       "      <td>179.7559</td>\n",
       "      <td>180.87</td>\n",
       "      <td>12479171.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24</th>\n",
       "      <td>182.33</td>\n",
       "      <td>183.5227</td>\n",
       "      <td>181.0400</td>\n",
       "      <td>181.06</td>\n",
       "      <td>7686030.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open      high       low   close      volume\n",
       "date                                                      \n",
       "2019-05-20  181.62  184.1800  181.6200  182.72  10044838.0\n",
       "2019-05-21  184.53  185.5800  183.9700  184.82   7198405.0\n",
       "2019-05-22  184.81  186.5603  184.0120  185.32   8412433.0\n",
       "2019-05-23  182.50  183.7300  179.7559  180.87  12479171.0\n",
       "2019-05-24  182.33  183.5227  181.0400  181.06   7686030.0"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_data_per_minute.resample('1D').agg({\n",
    "    'open': 'first',\n",
    "    'high': 'max', \n",
    "    'low': 'min', \n",
    "    'close': 'last', \n",
    "    'volume': 'sum'\n",
    "})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can downsample to quarterly data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-03-31</th>\n",
       "      <td>179.472295</td>\n",
       "      <td>181.794659</td>\n",
       "      <td>177.040428</td>\n",
       "      <td>179.551148</td>\n",
       "      <td>3.292640e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-06-30</th>\n",
       "      <td>180.373770</td>\n",
       "      <td>182.277689</td>\n",
       "      <td>178.595964</td>\n",
       "      <td>180.704687</td>\n",
       "      <td>2.405532e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-09-30</th>\n",
       "      <td>180.812130</td>\n",
       "      <td>182.890886</td>\n",
       "      <td>178.955229</td>\n",
       "      <td>181.028492</td>\n",
       "      <td>2.701982e+07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-31</th>\n",
       "      <td>145.272460</td>\n",
       "      <td>147.620121</td>\n",
       "      <td>142.718943</td>\n",
       "      <td>144.868730</td>\n",
       "      <td>2.697433e+07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  open        high         low       close        volume\n",
       "date                                                                    \n",
       "2018-03-31  179.472295  181.794659  177.040428  179.551148  3.292640e+07\n",
       "2018-06-30  180.373770  182.277689  178.595964  180.704687  2.405532e+07\n",
       "2018-09-30  180.812130  182.890886  178.955229  181.028492  2.701982e+07\n",
       "2018-12-31  145.272460  147.620121  142.718943  144.868730  2.697433e+07"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.resample('Q').mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also use `apply()`. Here, we show the quarterly change from start to end:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-03-31</th>\n",
       "      <td>-22.53</td>\n",
       "      <td>-20.1600</td>\n",
       "      <td>-23.410</td>\n",
       "      <td>-21.63</td>\n",
       "      <td>41282390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-06-30</th>\n",
       "      <td>39.51</td>\n",
       "      <td>38.3997</td>\n",
       "      <td>39.844</td>\n",
       "      <td>38.93</td>\n",
       "      <td>-20984389</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-09-30</th>\n",
       "      <td>-25.04</td>\n",
       "      <td>-28.6600</td>\n",
       "      <td>-29.660</td>\n",
       "      <td>-32.90</td>\n",
       "      <td>20304060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-12-31</th>\n",
       "      <td>-28.58</td>\n",
       "      <td>-31.2400</td>\n",
       "      <td>-31.310</td>\n",
       "      <td>-31.35</td>\n",
       "      <td>-1782369</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open     high     low  close    volume\n",
       "date                                               \n",
       "2018-03-31 -22.53 -20.1600 -23.410 -21.63  41282390\n",
       "2018-06-30  39.51  38.3997  39.844  38.93 -20984389\n",
       "2018-09-30 -25.04 -28.6600 -29.660 -32.90  20304060\n",
       "2018-12-31 -28.58 -31.2400 -31.310 -31.35  -1782369"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.drop(columns='trading_volume').resample('Q').apply(\n",
    "    lambda x: x.last('1D').values - x.first('1D').values\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Consider the following melted stock data by the minute. We don't see the OHLC data directly:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>price</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:33:00</th>\n",
       "      <td>182.9500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:34:00</th>\n",
       "      <td>183.0600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        price\n",
       "date                         \n",
       "2019-05-20 09:30:00  181.6200\n",
       "2019-05-20 09:31:00  182.6100\n",
       "2019-05-20 09:32:00  182.7458\n",
       "2019-05-20 09:33:00  182.9500\n",
       "2019-05-20 09:34:00  183.0600"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "melted_stock_data = pd.read_csv('data/melted_stock_data.csv', index_col='date', parse_dates=True)\n",
    "melted_stock_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use the `ohlc()` method after resampling to recover the OHLC columns:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20</th>\n",
       "      <td>181.62</td>\n",
       "      <td>184.1800</td>\n",
       "      <td>181.6200</td>\n",
       "      <td>182.72</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-21</th>\n",
       "      <td>184.53</td>\n",
       "      <td>185.5800</td>\n",
       "      <td>183.9700</td>\n",
       "      <td>184.82</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-22</th>\n",
       "      <td>184.81</td>\n",
       "      <td>186.5603</td>\n",
       "      <td>184.0120</td>\n",
       "      <td>185.32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-23</th>\n",
       "      <td>182.50</td>\n",
       "      <td>183.7300</td>\n",
       "      <td>179.7559</td>\n",
       "      <td>180.87</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-24</th>\n",
       "      <td>182.33</td>\n",
       "      <td>183.5227</td>\n",
       "      <td>181.0400</td>\n",
       "      <td>181.06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              open      high       low   close\n",
       "date                                          \n",
       "2019-05-20  181.62  184.1800  181.6200  182.72\n",
       "2019-05-21  184.53  185.5800  183.9700  184.82\n",
       "2019-05-22  184.81  186.5603  184.0120  185.32\n",
       "2019-05-23  182.50  183.7300  179.7559  180.87\n",
       "2019-05-24  182.33  183.5227  181.0400  181.06"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "melted_stock_data.resample('1D').ohlc()['price']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, we can upsample to increase the granularity. Note this will introduce `NaN` values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02 00:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903.0</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 06:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 12:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 18:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03 00:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563.0</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       open    high     low   close      volume trading_volume\n",
       "date                                                                          \n",
       "2018-01-02 00:00:00  177.68  181.58  177.55  181.42  18151903.0            low\n",
       "2018-01-02 06:00:00     NaN     NaN     NaN     NaN         NaN            NaN\n",
       "2018-01-02 12:00:00     NaN     NaN     NaN     NaN         NaN            NaN\n",
       "2018-01-02 18:00:00     NaN     NaN     NaN     NaN         NaN            NaN\n",
       "2018-01-03 00:00:00  181.88  184.78  181.33  184.67  16886563.0            low"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.resample('6H').asfreq().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are many ways to handle these `NaN` values. We can forward-fill with `pad()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02 00:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 06:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 12:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 18:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03 00:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       open    high     low   close    volume trading_volume\n",
       "date                                                                        \n",
       "2018-01-02 00:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-02 06:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-02 12:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-02 18:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-03 00:00:00  181.88  184.78  181.33  184.67  16886563            low"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.resample('6H').pad().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can specify a specific value or a method with `fillna()`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02 00:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 06:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 12:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 18:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03 00:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       open    high     low   close    volume trading_volume\n",
       "date                                                                        \n",
       "2018-01-02 00:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-02 06:00:00  177.68  181.58  177.55  181.42  18151903            low\n",
       "2018-01-02 12:00:00  181.88  184.78  181.33  184.67  16886563            low\n",
       "2018-01-02 18:00:00  181.88  184.78  181.33  184.67  16886563            low\n",
       "2018-01-03 00:00:00  181.88  184.78  181.33  184.67  16886563            low"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.resample('6H').fillna('nearest').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can use `asfreq()` and `assign()` to specify the action per column:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>trading_volume</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02 00:00:00</th>\n",
       "      <td>177.68</td>\n",
       "      <td>181.58</td>\n",
       "      <td>177.55</td>\n",
       "      <td>181.42</td>\n",
       "      <td>18151903.0</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 06:00:00</th>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 12:00:00</th>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-02 18:00:00</th>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>181.42</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03 00:00:00</th>\n",
       "      <td>181.88</td>\n",
       "      <td>184.78</td>\n",
       "      <td>181.33</td>\n",
       "      <td>184.67</td>\n",
       "      <td>16886563.0</td>\n",
       "      <td>low</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       open    high     low   close      volume trading_volume\n",
       "date                                                                          \n",
       "2018-01-02 00:00:00  177.68  181.58  177.55  181.42  18151903.0            low\n",
       "2018-01-02 06:00:00  181.42  181.42  181.42  181.42         0.0            NaN\n",
       "2018-01-02 12:00:00  181.42  181.42  181.42  181.42         0.0            NaN\n",
       "2018-01-02 18:00:00  181.42  181.42  181.42  181.42         0.0            NaN\n",
       "2018-01-03 00:00:00  181.88  184.78  181.33  184.67  16886563.0            low"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb.resample('6H').asfreq().assign(\n",
    "    volume=lambda x: x.volume.fillna(0), # put 0 when market is closed\n",
    "    close=lambda x: x.close.fillna(method='ffill'), # carry forward\n",
    "    # take the closing price if these aren't available\n",
    "    open=lambda x: np.where(x.open.isnull(), x.close, x.open),\n",
    "    high=lambda x: np.where(x.high.isnull(), x.close, x.high),\n",
    "    low=lambda x: np.where(x.low.isnull(), x.close, x.low)\n",
    ").head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Merging\n",
    "We saw merging examples the [1-querying_and_merging.ipynb notebook](https://github.com/stefmolin/Hands-On-Data-Analysis-with-Pandas/blob/master/ch_04/1-querying_and_merging.ipynb). However, they all matched based on keys. With time series, it is possible that they are so granular that we never have the same time for multiple entries. Let's work with some stock data at different granularities:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sqlite3\n",
    "\n",
    "with sqlite3.connect('data/stocks.db') as connection:\n",
    "    fb_prices = pd.read_sql(\n",
    "        'SELECT * FROM fb_prices', connection, \n",
    "        index_col='date', parse_dates=['date']\n",
    "    )\n",
    "    aapl_prices = pd.read_sql(\n",
    "        'SELECT * FROM aapl_prices', connection, \n",
    "        index_col='date', parse_dates=['date']\n",
    "    )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Facebook prices are at the minute granularity:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int64Index([0], dtype='int64', name='date')"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb_prices.index.second.unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "However, the Apple prices have information for the second:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Int64Index([ 0, 52, 36, 34, 55, 35,  7, 12, 59, 17,  5, 20, 26, 23, 54, 49, 19,\n",
       "            53, 11, 22, 13, 21, 10, 46, 42, 38, 33, 18, 16,  9, 56, 39,  2, 50,\n",
       "            31, 58, 48, 24, 29,  6, 47, 51, 40,  3, 15, 14, 25,  4, 43,  8, 32,\n",
       "            27, 30, 45,  1, 44, 57, 41, 37, 28],\n",
       "           dtype='int64', name='date')"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "aapl_prices.index.second.unique()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can perform an `asof` merge to try to line these up the best we can. We specify how to handle the mismatch with the `direction` and `tolerance` parameters. We will fill in with the `direction` of `nearest` and a `tolerance` of 30 seconds. This will place the Apple data with the minute that it is closest to, so 9:31:52 will go with 9:32 and 9:37:07 will go with 9:37. Since the times are on the index, we pass `left_index` and `right_index`, as we did with merges earlier this chapter: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FB</th>\n",
       "      <th>AAPL</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "      <td>183.5200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.8710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:33:00</th>\n",
       "      <td>182.9500</td>\n",
       "      <td>182.5000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:34:00</th>\n",
       "      <td>183.0600</td>\n",
       "      <td>182.1067</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           FB      AAPL\n",
       "date                                   \n",
       "2019-05-20 09:30:00  181.6200  183.5200\n",
       "2019-05-20 09:31:00  182.6100       NaN\n",
       "2019-05-20 09:32:00  182.7458  182.8710\n",
       "2019-05-20 09:33:00  182.9500  182.5000\n",
       "2019-05-20 09:34:00  183.0600  182.1067"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge_asof(\n",
    "    fb_prices, aapl_prices, \n",
    "    left_index=True, right_index=True, # datetimes are in the index\n",
    "    # merge with nearest minute\n",
    "    direction='nearest', tolerance=pd.Timedelta(30, unit='s')\n",
    ").head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we don't want to lose the seconds information with the Apple data, we can use `pd.merge_ordered()` instead, which will interleave the two. Note this is an outer join by default (`how` parameter). The only catch here is that we need to reset the index in order to join on it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FB</th>\n",
       "      <th>AAPL</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "      <td>183.520</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:52</th>\n",
       "      <td>NaN</td>\n",
       "      <td>182.871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:36</th>\n",
       "      <td>NaN</td>\n",
       "      <td>182.500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           FB     AAPL\n",
       "date                                  \n",
       "2019-05-20 09:30:00  181.6200  183.520\n",
       "2019-05-20 09:31:00  182.6100      NaN\n",
       "2019-05-20 09:31:52       NaN  182.871\n",
       "2019-05-20 09:32:00  182.7458      NaN\n",
       "2019-05-20 09:32:36       NaN  182.500"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge_ordered(\n",
    "    fb_prices.reset_index(), aapl_prices.reset_index()\n",
    ").set_index('date').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can pass a `fill_method` to handle `NaN` values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FB</th>\n",
       "      <th>AAPL</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:30:00</th>\n",
       "      <td>181.6200</td>\n",
       "      <td>183.520</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:00</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>183.520</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:31:52</th>\n",
       "      <td>182.6100</td>\n",
       "      <td>182.871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:00</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-20 09:32:36</th>\n",
       "      <td>182.7458</td>\n",
       "      <td>182.500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           FB     AAPL\n",
       "date                                  \n",
       "2019-05-20 09:30:00  181.6200  183.520\n",
       "2019-05-20 09:31:00  182.6100  183.520\n",
       "2019-05-20 09:31:52  182.6100  182.871\n",
       "2019-05-20 09:32:00  182.7458  182.871\n",
       "2019-05-20 09:32:36  182.7458  182.500"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge_ordered(\n",
    "    fb_prices.reset_index(), aapl_prices.reset_index(),\n",
    "    fill_method='ffill'\n",
    ").set_index('date').head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Alternatively, we can use `fillna()`."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
